package com.lyb.command.impl;

import com.lyb.Utils;
import com.lyb.command.AlpacaCommand;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;

/**
 * curl 命令处理类
 *
 * @author ahuang potato Mr.Alpaca
 * @version 1.4.0
 */
public class CurlCommand implements AlpacaCommand {
    /**
     * 表示该类负责处理的命令
     */
    private static final String COMMAND = "curl";

    /**
     * 格式判断，输入语句需满足以下情况
     * 1.格式：{"curl", "网站"} 或者 {"curl", "网站", "目录路径"}
     * 2.电脑路径符合目录格式
     * (网站是否存在交由运行时判断)
     *
     * @param input 用户输入的语句(已切分)
     * @return 判断结果
     */
    @Override
    public boolean formatJudge(String[] input) {
        /* 若输入语句没有一个或两个参数则错误 */
        if (input.length != 3) {
            if (input.length != 2) {
                return false;
            }

        }
        if (input.length == 3) {
            /* 第二个路径参数必须为目录格式 */
            if (!Utils.isDirectoryFormat(input[2])) {
                Utils.outCommandResult("[系统]: 路径: " + input[2] + " 不合法(非目录)");
                return false;
            }
        }

        return true;
    }

    /**
     * 运行命令，调用相关函数输出操作结果
     *
     * @param command 命令语句
     */
    @Override
    public void go(String[] command) {
        /* 读取初始URL */
        String address = command[1];
        URL url = null;
        HttpURLConnection connection = null;

        /* 根据传入链接创建网络通道 */
        try {
            url = new URL(address);
            connection = (HttpURLConnection) url.openConnection();
        } catch (MalformedURLException e) {
            Utils.outCommandResult("[系统]: 链接 " + command[1] + " 不符合规范");
            Utils.outCommandOver();
            return;
        } catch (IOException e) {
            Utils.outCommandResult("[系统]: 网络连接失败，请重试");
            Utils.outCommandOver();
            return;
        }

        /* 发送网络请求并获取响应内容 */
        StringBuilder response = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));) {
            String line = "";
            /* 逐行读取响应内容 */
            while ((line = reader.readLine()) != null) {
                response.append(line).append("\n");
            }
        } catch (IOException e) {
            Utils.outCommandResult("[系统]: 网络请求发生中断，无法获取服务区响应，请重试");
            Utils.outCommandOver();
            return;
        }

        /* 如果命令有指定路径，则网页内容输出在命令中指定的路径下，不在控制台输出 */
        if (command.length == 3) {
            /* 确定响应内容所写入的文件路径 */
            String path = command[2].replace("\\", "/");
            int lastIndex = path.length() - 1;
            File dir = new File(command[2]);

            /* 若目录不存在则先创建目录 */
            if (!dir.exists()) {
                if (!dir.mkdirs()) {
                    Utils.outCommandResult("[系统]: 指定目录 " + command[2] + " 创建失败");
                    Utils.outCommandOver();
                    return;
                }
            }

            /* 若目录末尾无分隔符则补充上去 */
            if (path.charAt(lastIndex) != '/') {
                path += "/";
            }

            /* 指定网络响应存储文件 */
            File file = new File(path + url.getHost() + ".txt");
            if (!file.exists()) {
                try {
                    if (!file.createNewFile()) {
                        Utils.outCommandResult("[系统]: 存储文件 " + file.getPath() + " 创建失败");
                        Utils.outCommandOver();
                        return;
                    }
                } catch (IOException e) {
                    Utils.outCommandResult("[系统]: 网络请求异常，请重试");
                    Utils.outCommandOver();
                    return;
                }
            }

            /* 写入指定路径 */
            try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
                writer.write(response.toString());
            } catch (IOException e) {
                Utils.outCommandResult("[系统]: 网络响应写入文件失败");
                Utils.outCommandOver();
                return;
            }
        } else {
            /* 直接输出 */
            Utils.outCommandResult(response.toString());
        }
        Utils.outCommandResult("[系统]: 网页 " + command[1] + " 内容加载成功");
        Utils.outCommandOver();
    }

    @Override
    public String getCommand() {
        return COMMAND;
    }
}
